﻿using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Collections.Generic;

namespace likou.likou2024.June
{
    //494. 目标和
    //2024年7月3日21:24:03
    [TestClass]
    public class June30
    {
        [TestMethod]
        public void TestMethod1()
        {
            //字典
            Dictionary<string, int> myDict = new Dictionary<string, int>();
            myDict.Add("apple", 1);
            myDict.Add("banana", 2);

            // 访问值
            int value = myDict["apple"]; // value = 1

            // 检查键是否存在
            bool exists = myDict.ContainsKey("cherry"); // exists = false

            // 删除项
            myDict.Remove("banana");


            //元组
            //元组是一种可以组合多个不同类型的值的数据结构，它允许你将多个值作为一个单元传递或返回，而不需要定义一个新的类或结构
            var person = ("Alice", 30, "Engineer");

            // 访问元组的各个元素
            string name = person.Item1; // "Alice"
            int age = person.Item2; // 30
            string job = person.Item3; // "Engineer"

            // 使用命名元组字段
            var betterPerson = (Name: "Bob", Age: 28, Occupation: "Developer");

            string betterName = betterPerson.Name; // "Bob"
        }

        int[] nums;
        Dictionary<(int, int), int> map;
        public int FindTargetSumWays(int[] nums, int target)
        {
            this.nums = nums;
            map = [];
            int n = nums.Length;
            return Dfs(n-1,target);
        }

        int Dfs(int i,int target)
        {
            if (i < 0) return target == 0 ? 1 : 0;
            if (map.ContainsKey((i, target))) return map[(i,target)];

            //在C#中，当你在一个返回语句中使用赋值操作时，实际上是整个赋值表达式的结果（也就是被赋的值）被用作返回值
            return map[(i, target)] = Dfs(i - 1, target - nums[i]) + Dfs(i - 1, target + nums[i]);
        }
    }
}